package com.zp.manager.uploadtemplate;

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjUtil;
import com.zp.enums.ErrorCode;
import com.zp.exception.BusinessException;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.Set;

/**
 * 本地文件上传
 */
@Service
public class FilePictureUpload extends PictureUploadTemplate {

    /**
     * 校验图片
     *
     * @param t   图片
     * @param <T> 本地文件
     */
    @Override
    protected <T> void validPicture(T t) {
        // 强转为 MultipartFile
        MultipartFile multipartFile = (MultipartFile) t;
        if (ObjUtil.isEmpty(multipartFile)) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "文件不能为空");
        }
        // 1. 获取图片大小
        long fileSize = multipartFile.getSize();
        // 2. 文件大小限制
        final long MAX_SIZE = 1024 * 1024 * 8;
        if (fileSize > MAX_SIZE) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "文件大小不能超过 8 MB");
        }
        // 2. 校验文件后缀
        String originalFilename = multipartFile.getOriginalFilename();
        String fileSuffix = FileUtil.getSuffix(originalFilename);
        final Set<String> ALLOWED_SUFFIX = Set.of("jpg", "jpeg", "png", "webp");
        if (fileSuffix != null && !ALLOWED_SUFFIX.contains(fileSuffix.toLowerCase())) {
            throw new BusinessException(ErrorCode.PARAMS_ERROR, "文件格式错误");
        }
    }

    /**
     * 获取原始文件名
     *
     * @param t   本地文件
     * @param <T> MultipartFile
     * @return 原始文件名
     */
    @Override
    protected <T> String getOriginalFilename(T t) {
        // 强转为 MultipartFile
        MultipartFile multipartFile = (MultipartFile) t;
        return multipartFile.getOriginalFilename();
    }

    /**
     * 处理文件: 上传到指定服务器
     *
     * @param t    本地文件
     * @param file 文件
     * @param <T>  MultipartFile
     * @throws IOException IO 异常
     */
    @Override
    protected <T> void processFile(T t, File file) throws IOException {
        // 强转为 MultipartFile
        MultipartFile multipartFile = (MultipartFile) t;
        multipartFile.transferTo(file);
    }
}
